package com.ruoyi.framework.web.service;

import com.getui.push.v2.sdk.ApiHelper;
import com.getui.push.v2.sdk.GtApiConfiguration;
import com.getui.push.v2.sdk.api.PushApi;
import com.getui.push.v2.sdk.api.UserApi;
import com.getui.push.v2.sdk.common.ApiResult;
import com.getui.push.v2.sdk.dto.req.Audience;
import com.getui.push.v2.sdk.dto.req.message.PushDTO;
import com.getui.push.v2.sdk.dto.req.message.PushMessage;
import com.ruoyi.system.service.impl.SysUserServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * 个推推送帮助类
 */
@Component
public class GTPushService {
    private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);

    PushApi pushApi;
    UserApi userApi;

    @Value("${gtpush.appId}")
    private String appId;

    @Value("${gtpush.appKey}")
    private String appKey;

    @Value("${gtpush.appSecret}")
    private String appSecret;

    @Value("${gtpush.masterSecret}")
    private String masterSecret;

    @PostConstruct
    public void init() {
        // 设置httpClient最大连接数，当并发较大时建议调大此参数。或者启动参数加上 -Dhttp.maxConnections=200
        System.setProperty("http.maxConnections", "200");
        GtApiConfiguration apiConfiguration = new GtApiConfiguration();
        //填写应用配置
        apiConfiguration.setAppId(appId);
        apiConfiguration.setAppKey(appKey);
        apiConfiguration.setMasterSecret(masterSecret);
        // 接口调用前缀，请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId
        apiConfiguration.setDomain("https://restapi.getui.com/v2/");
        // 实例化ApiHelper对象，用于创建接口对象
        ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
        // 创建对象，建议复用。目前有PushApi、StatisticApi、UserApi
        pushApi = apiHelper.creatApi(PushApi.class);
        userApi = apiHelper.creatApi(UserApi.class);
    }

    /**
     * 透传单推消息
     * @param cid
     * @param transmission
     */
    public boolean transmissionPushByCid(String cid,String transmission) {
        //根据cid进行单推
        PushDTO<Audience> pushDTO = new PushDTO<Audience>();
        // 设置推送参数
        pushDTO.setRequestId(System.currentTimeMillis() + "");
        /**** 设置个推通道参数 *****/
        PushMessage pushMessage = new PushMessage();
        pushDTO.setPushMessage(pushMessage);

        pushMessage.setTransmission(transmission);
//        GTNotification notification = new GTNotification();
//        pushMessage.setNotification(notification);
//        notification.setTitle("个title");
//        notification.setBody("个body");
//        notification.setClickType("url");
//        notification.setUrl("https://www.getui.com");
        /**** 设置个推通道参数，更多参数请查看文档或对象源码 *****/

        /**** 设置厂商相关参数 ****/
//        PushChannel pushChannel = new PushChannel();
//        pushDTO.setPushChannel(pushChannel);
//        /*配置安卓厂商参数*/
//        AndroidDTO androidDTO = new AndroidDTO();
//        pushChannel.setAndroid(androidDTO);
//        Ups ups = new Ups();
//        androidDTO.setUps(ups);
//        ThirdNotification thirdNotification = new ThirdNotification();
//        ups.setNotification(thirdNotification);
//        thirdNotification.setTitle("厂商title");
//        thirdNotification.setBody("厂商body");
//        thirdNotification.setClickType("url");
//        thirdNotification.setUrl("https://www.getui.com");
        // 两条消息的notify_id相同，新的消息会覆盖老的消息，取值范围：0-2147483647
        // thirdNotification.setNotifyId("11177");
        /*配置安卓厂商参数结束，更多参数请查看文档或对象源码*/

        /*设置ios厂商参数*/
//        IosDTO iosDTO = new IosDTO();
//        pushChannel.setIos(iosDTO);
//        // 相同的collapseId会覆盖之前的消息
//        iosDTO.setApnsCollapseId("xxx");
//        Aps aps = new Aps();
//        iosDTO.setAps(aps);
//        Alert alert = new Alert();
//        aps.setAlert(alert);
//        alert.setTitle("ios title");
//        alert.setBody("ios body");
        /*设置ios厂商参数结束，更多参数请查看文档或对象源码*/

        /*设置接收人信息*/
        Audience audience = new Audience();
        pushDTO.setAudience(audience);
        audience.addCid(cid);
        /*设置接收人信息结束*/
        /**** 设置厂商相关参数，更多参数请查看文档或对象源码 ****/

        // 进行cid单推
        ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);
        if (apiResult.isSuccess()) {
            // success
            log.debug( "transmissionPushByCid ：" + apiResult.getData());
            return true;
        } else {
            // failed
            log.debug( "transmissionPushByCid ：" + "code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
            return false;
        }
    }

    public boolean isOnline(String cid){
        Set<String> cidSet = new HashSet<>();
        cidSet.add(cid);
        try {
            String status = userApi.queryUserStatus(cidSet).getData().get(cid).getStatus();
            return "online".equals(status);
        }catch (Exception e){
            e.printStackTrace();
        }
        return false;
    }
}
